
/*************
author:: libo
license:: MIT
*****************/

#ifndef LIBCELL_TOOLS_OCTREE_H_
#define LIBCELL_TOOLS_OCTREE_H_
//#include<Mesh_IO/Mesh_IO.h>
#include<Mesh/Mesh_Frame.h>
#include<string.h>
#include "math.h"
#ifdef __cplusplus
extern "C" {
#endif

typedef struct OC_Node{
    struct OC_Node* parent;
    struct OC_Node *children[8];
    double loc_min[3],loc_max[3]; 
    int depth;
    Node* value; 
    void* prop;
}OC_Node;

static inline void oc_node_init(OC_Node*ocn)
{
    ocn->parent=NULL;
    memset(ocn->children,0,sizeof(OC_Node*)*8);
    ocn->loc_min[0]=0;ocn->loc_min[1]=0;ocn->loc_min[2]=0;
    ocn->loc_max[0]=0;ocn->loc_max[1]=0;ocn->loc_max[2]=0;
    ocn->depth=0;
    ocn->value=NULL;
    ocn->prop=NULL; 
}



void oc_node_init_from_node(OC_Node*ocn,Node*);

void oc_node_free(OC_Node*ocn);

//对叶子结点再分割(不管其是否包含顶点，包含多少个顶点)
//输入的ocn是一个叶子结点
//返回含有顶点体素的个数
//

int oc_node_divide_one_leaf(OC_Node* ocn);

//八叉树中的顶点个数
int oc_node_vertices_size(OC_Node* ocn);


//含有顶点的体素
int oc_node_voxel_size(OC_Node*ocn);

//八叉树的叶子结点个数
int oc_node_leaf_size(OC_Node*ocn);

//输入八叉树的某个结点，对它以下的所有含有顶点(体素包含多于1个顶点)的体素划分一次
//返回划分后含有顶点的体素个数
int oc_node_divide_all_leaves(OC_Node* ocn);
//

//输入八叉树的某个结点，对它以下的所有含有顶点的体素划分,但是当value(Node*)的元素低于等于num时，不会继续划分
//返回划分后含有顶点的体素个数
int oc_node_divide_all_leaves1(OC_Node* ocn,int num);
//int oc_tree_size();




#ifdef __cplusplus
}
#endif
#endif
